package service;

import java.io.Serializable;
import java.util.Date;
import java.util.List;

import org.springframework.transaction.annotation.Transactional;

import dao.GenericDAO;
import entity.EntityManaged;

public abstract class ManutencaoServiceImpl<T extends EntityManaged> implements
		ManutencaoService<T> {

	public abstract GenericDAO<T> getDAO();

	protected void validarDados(T objeto) {
	}

	@Transactional
	public void salvar(T objeto) {

		this.validarDados(objeto);
		if (objeto.getId() == null) {
			objeto.setAtivo(true);
			objeto.setDataInclusao(new Date());
			getDAO().salvar(objeto);
		} else {
			objeto.setDataAlteracao(new Date());
			getDAO().merge(objeto);
		}
	}

	@Transactional
	public void remover(final T objeto) {
		getDAO().remover(buscarPorChave(objeto.getId()));
	}

	public T buscarPorChave(Serializable id) {
		return (T) getDAO().buscarPorChave(id);
	}

	public int buscarQuantidadeTotal() {
		return getDAO().buscarQuantidadeTotal();
	}

	public int buscarQuantidadeTotalAtivos() {
		return getDAO().buscarQuantidadeTotalAtivos();
	}

	public List<T> listarTodos() {
		return getDAO().listarTodos();
	}

	public List<T> listarInativos() {
		return getDAO().listarInativos();
	}

	public List<T> listarAtivos() {
		return getDAO().listarAtivos();
	}

	public List<T> listarPorExemplo(T objeto) {
		return getDAO().listarPorExemplo(objeto);
	}
}
